////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Copyright (c) 2017-2018 Qualcomm Technologies, Inc.
// All Rights Reserved.
// Confidential and Proprietary - Qualcomm Technologies, Inc.
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// THIS IS AUTO-GENERATED CODE.  PLEASE DO NOT EDIT (File bug reports against tools).
///
/// Auto-generated by: ParameterParser V1.1.4
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// @file  camxflashdriver.h
/// @brief Auto-generated Chromatix parameter file
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

#ifndef CAMXFLASHDRIVER_H
#define CAMXFLASHDRIVER_H

#include "parametermodule.h"
#include "parameterfilesymboltable.h"
#include "parametertypes.h"
#include "camxsensorcommon.h"

#define CAMX_NAMESPACE_BEGIN namespace CamX {
#define CAMX_NAMESPACE_END }

CAMX_NAMESPACE_BEGIN

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// FlashDriverType
/// Comments:      Flash driver type
///                Valid values are: PMIC, I2C
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
enum class FlashDriverType
{
    PMIC = 0,
    I2C  = 1
};

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// FlashI2CInformation
///
/// Description:   Slave and settings information for I2C based flash
/// Comments:      Slave and settings for I2C based flash
///                This information is available only for I2C based flash
///                 element for slaveAddress
///                 elemet for regAddrType
///                 element for regDataType
///                 element for I2CFrequencyMode
///                 element for flashInitSettings
///                 element for flashOffSettings
///                 element for flashLowSettings
///                 element for flashHighSettings
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
struct FlashI2CInformation
{
    /// 8-bit or 10-bit I2C slave Write address
    UINT16                               slaveAddress;

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// regAddrType
    ///
    /// Range:         [1,4]
    /// Comments:      Register address / data size in bytes
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    I2CRegAddrDataType regAddrType;

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// regDataType
    ///
    /// Range:         [1,4]
    /// Comments:      Register address / data size in bytes
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    I2CRegAddrDataType regDataType;

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// i2cFrequencyMode
    /// Default Value: FAST
    /// Comments:      I2C frequency mode of slave
    ///                Supported modes are: STANDARD (100 KHz), FAST (400 KHz), FAST_PLUS (1 MHz), CUSTOM (Custom frequency in
    ///                DTSI)
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    I2CFrequencyMode   i2cFrequencyMode;

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// flashInitSettings
    /// Comments:      Sequence of register settings to configure the device
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    SettingsInfo       flashInitSettings;

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// flashOffSettings
    /// Comments:      Sequence of register settings to configure the device
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    SettingsInfo       flashOffSettings;

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// flashLowSettings
    /// Comments:      Sequence of register settings to configure the device
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    SettingsInfo       flashLowSettings;

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// flashHighSettings
    /// Comments:      Sequence of register settings to configure the device
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    SettingsInfo       flashHighSettings;
};

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// TriggerInformation
/// Comments:      Flash trigger information
///                 element for maxFlashCurrent
///                 element for maxTorchCurrent
///                 element for maxFlashDuration
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
struct TriggerInformation
{
    /// Maximum flash current of trigger in milli amperes
    UINT32 maxFlashCurrent;
    /// Maximum torch current of trigger in milli amperes
    UINT32 maxTorchCurrent;
    /// Maximum flash duration of trigger in milli seconds
    UINT32 maxFlashDuration;
};

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// FlashInformation
/// Comments:      Flash information
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
struct FlashInformation
{

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// triggerInfo - Array
    /// Min Length:    1
    /// Max Length:    Unbounded
    /// Comments:      Flash trigger information
    ///                 element for maxFlashCurrent
    ///                 element for maxTorchCurrent
    ///                 element for maxFlashDuration
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    UINT32              triggerInfoCount;
    UINT32              triggerInfoID;
    TriggerInformation* triggerInfo;
};

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// NumberOfFlashs
///
/// Range:         [1,3]
/// Comments:      Number of Flash supported in kernel
///                Valid values for are: 1, 2 and 3
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
typedef UINT16 NumberOfFlashs;

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// FlashDriverData
/// Comments:      Flash driver data
///                 element for flashName
///                 element for flash driver type
///                 element for power up sequence
///                 element for power down sequence
///                 element for i2cInfo
///                 element for flashInformation
///                 element for numberOfFlashs
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
struct FlashDriverData
{
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// Binary file symbol table entry ID
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    UINT32 SymbolTableID;

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// module_version
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    struct module_versionStruct
    {
        ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
        /// Binary file symbol table entry ID
        ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
        UINT32 SymbolTableID;
        INT32 major_revision;
        INT32 minor_revision;
        INT32 incr_revision;
    } module_version;
    /// Name of the flash
    CHAR*                                flashName;

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// flashDriverType
    /// Default Value: PMIC
    /// Comments:      Flash driver type
    ///                Valid values are: PMIC, I2C
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    FlashDriverType                      flashDriverType;

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// powerUpSequence - Optional
    /// Min Length:    0
    /// Max Length:    1
    /// Comments:      Sequence of power configuration type and configuration value required to control power to the device
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    UINT32                               powerUpSequenceExists;
    UINT32                               powerUpSequenceID;
    PowerSequenceInfo  powerUpSequence;

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// powerDownSequence - Optional
    /// Min Length:    0
    /// Max Length:    1
    /// Comments:      Sequence of power configuration type and configuration value required to control power to the device
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    UINT32                               powerDownSequenceExists;
    UINT32                               powerDownSequenceID;
    PowerSequenceInfo  powerDownSequence;

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// i2cInfo - Optional
    ///
    /// Description:   Slave and settings information for I2C based flash
    /// Min Length:    0
    /// Max Length:    1
    /// Comments:      Slave and settings for I2C based flash
    ///                This information is available only for I2C based flash
    ///                 element for slaveAddress
    ///                 elemet for regAddrType
    ///                 element for regDataType
    ///                 element for I2CFrequencyMode
    ///                 element for flashInitSettings
    ///                 element for flashOffSettings
    ///                 element for flashLowSettings
    ///                 element for flashHighSettings
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    UINT32                               i2cInfoExists;
    UINT32                               i2cInfoID;
    FlashI2CInformation                  i2cInfo;

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// flashInformation - Optional
    /// Min Length:    0
    /// Max Length:    1
    /// Comments:      Flash information
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    UINT32                               flashInformationExists;
    UINT32                               flashInformationID;
    FlashInformation                     flashInformation;

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// numberOfFlashs
    ///
    /// Default Value: 1
    /// Range:         [1,3]
    /// Comments:      Number of Flash supported in kernel
    ///                Valid values for are: 1, 2 and 3
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    NumberOfFlashs                       numberOfFlashs;
};

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// FlashDriverDataClass
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
class FlashDriverDataClass : public ParameterModule, public FlashDriverData
{
public:
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// Version
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    static const UINT16 MAJOR = 1;
    static const UINT16 MINOR = 0;
    static const UINT32 PATCH = 0;

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// Default Constructor
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    FlashDriverDataClass(
        const CHAR* name);

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// Constructor
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    FlashDriverDataClass(
        const CHAR* name,
        UINT32 modeId,
        UINT16 mode,
        UINT16 subMode,
        UINT32 group);

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// Destructor
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    virtual ~FlashDriverDataClass();

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// GetName
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    static const CHAR* GetName(
        const CHAR* type);


    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// Load FlashI2CInformation
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    static BOOL LoadFlashI2CInformation(
        ParameterFileSymbolTableEntry* entry,
        FlashI2CInformation* structure);

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// Load TriggerInformation
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    static BOOL LoadTriggerInformation(
        ParameterFileSymbolTableEntry* entry,
        TriggerInformation* structure);

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// Load FlashInformation
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    static BOOL LoadFlashInformation(
        ParameterFileSymbolTableEntry* entry,
        FlashInformation* structure);

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// Load FlashDriverData
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    static BOOL LoadFlashDriverData(
        ParameterFileSymbolTableEntry* entry,
        FlashDriverData* structure);

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// Load module_versionStruct
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    static BOOL Loadmodule_versionStruct(
        ParameterFileSymbolTableEntry* entry,
        FlashDriverData::module_versionStruct* structure);

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// Unload FlashI2CInformation
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    static void UnloadFlashI2CInformation(
        FlashI2CInformation* structure);

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// Unload FlashInformation
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    static void UnloadFlashInformation(
        FlashInformation* structure);

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// Unload FlashDriverData
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    static void UnloadFlashDriverData(
        FlashDriverData* structure);

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// Parse symbol table entry, and return a new object
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    virtual ParameterModule* Parse(
        ParameterSetManager* manager,
        ParameterFileSymbolTableEntry* entry) const;

}; // End class FlashDriverDataClass

CAMX_NAMESPACE_END
#endif // CAMXFLASHDRIVER_H

